package code.juc.stopThread;

/**
 * 停止线程的最佳实践: (优先选择： 传递中断)
 * catch了InterruptedException之后优先选择, 是throws InterruptedException;
 * 那么在run()方法中, 就能进行相应的try/catch.
 * <p>
 * 牢记:
 * 1. 写的方法, 若是给其它线程使用, 需要直接抛出中断异常.
 * 2. 在run()方法中, 调用其它方法时, 需要注意, 这些方法, 是否对中断异常, 进行了try...catch; 切记, 不能让这些
 * 方法try...catch了中断异常; 否则, 可能导致无法中断线程.
 *
 * tips:
 *  1.  @lombok.SneakyThrows这个注解的作用：
 *      1. 生成一个throws Exception.
 *      2. 在相应的调用出, 帮你生成try...catch模板.
 */
public class StopThreadInProd implements Runnable {
    @Override
    public void run() {
        try {
            while (true) {
                System.out.println("GO");
                aVoid();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

//    @lombok.SneakyThrows
    private void aVoid() throws InterruptedException {
        Thread.sleep(1000);
    }

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new StopThreadInProd());
        thread.start();
        Thread.sleep(500);
        thread.interrupt();
    }
}
